home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / msn / p11 / MSNP11Notification.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  9KB  |  222 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import logging
  5. import hashlib
  6. import rfc822
  7. import struct
  8. import string
  9. import re
  10. import util
  11. import msn
  12. from util.Events import event
  13. from msn.p10 import Notification as Super
  14. log = logging.getLogger('msn.p11.ns')
  15. defcb = dict(trid = True, callback = sentinel)
  16. MAX_SINT = 2147483647
  17. psmurl_re = re.compile('\\<PSMUrl\\>(.*?)\\</PSMUrl\\>', re.IGNORECASE)
  18. format_re = re.compile('%\\((.*?)\\)s')
  19.  
  20. def psm_url_fix(datatag_str):
  21.     match = psmurl_re.search(datatag_str)
  22.     if match:
  23.         url = match.group(1)
  24.         (start, end) = match.span()
  25.         newmsg = datatag_str[:start] + datatag_str[end:]
  26.     else:
  27.         url = ''
  28.         newmsg = datatag_str
  29.     return (newmsg, url)
  30.  
  31.  
  32. def transform_format_groups(fmtstring):
  33.     fixed = []
  34.     keys = []
  35.     last_end = 0
  36.     match = format_re.search(fmtstring, last_end)
  37.     while match:
  38.         key = match.group(1)
  39.         if key not in keys:
  40.             keys.append(key)
  41.         
  42.         fixed.append(fmtstring[last_end:match.start()])
  43.         fixed.append('{%d}' % keys.index(key))
  44.         last_end = match.end()
  45.         match = format_re.search(fmtstring, last_end)
  46.     fixed.append(fmtstring[last_end:])
  47.     return (''.join(fixed), keys)
  48.  
  49.  
  50. def format_mediainfo(info):
  51.     return repr(info)
  52.  
  53.  
  54. class MSNP11Notification(Super):
  55.     versions = [
  56.         'MSNP11']
  57.     client_chl_id = challenge_id = 'PROD0090YUAUV{2B'
  58.     client_chl_code = 'YMM8C_H7KCQ2S_KL'
  59.     events = Super.events | set(('contact_status_msg', 'received_oims'))
  60.     
  61.     def __init__(self, *a, **k):
  62.         self.oims = []
  63.         Super.__init__(self, *a, **k)
  64.  
  65.     
  66.     def recv_sbs(self, msg):
  67.         log.warning('Got SBS command')
  68.  
  69.     
  70.     def recv_ubx(self, msmsg):
  71.         (bname,) = msmsg.args
  72.         msg = msmsg.payload
  73.         log.info('Got UBX for %s: %r', bname, str(msg))
  74.         if not msg:
  75.             msg = '<data />'
  76.         
  77.         (msg, url) = psm_url_fix(msg)
  78.         
  79.         try:
  80.             msg = util.tag(msg)
  81.         except Exception:
  82.             import traceback as traceback
  83.             traceback.print_exc()
  84.             msg = util.tag('<data />')
  85.  
  86.         status_message = ''
  87.         now_playing = ''
  88.         if msg.PSM:
  89.             status_message = msg.PSM._cdata.decode('xml')
  90.             log.info('%r has status message of: %r', bname, status_message)
  91.         
  92.         status_message = None if status_message and now_playing else now_playing
  93.         self.event('contact_status_msg', bname, status_message)
  94.  
  95.     
  96.     def recv_chl(self, msg):
  97.         log.debug('got chl')
  98.         self.event('challenge', msg.args[0])
  99.  
  100.     
  101.     def recv_uux(self, msg):
  102.         unused_message = msg.payload
  103.  
  104.     
  105.     def send_uux(self, message = None, mediainfo = None, url = None, callback = None):
  106.         mtag = util.tag('Data')
  107.         if message is not None:
  108.             mtag.PSM._cdata = message
  109.         else:
  110.             mtag.PSM._cdata = ''
  111.         if mediainfo is not None:
  112.             mtag.CurrentMedia._cdata = mediainfo
  113.         else:
  114.             mtag.CurrentMedia._cdata = ''
  115.         if url is not None:
  116.             mtag.PSMUrl._cdata = url
  117.         else:
  118.             mtag.PSMUrl._cdata = ''
  119.         message = mtag._to_xml(pretty = False).encode('utf-8')
  120.         self.socket.send(msn.Message('UUX', payload = message), trid = True, callback = callback)
  121.  
  122.     
  123.     def _set_status_message(self, *a, **k):
  124.         return self.send_uux(*a, **k)
  125.  
  126.     
  127.     def set_message_object(self, messageobj, callback):
  128.         media = getattr(messageobj, 'media', None)
  129.         log.debug('set_message_object got this for (messageobj, media): %r', (messageobj, media))
  130.         if media is not None:
  131.             fmt = util.get(media, 'format_string', '')
  132.             args = util.get(media, 'format_args', { })
  133.             if fmt and args:
  134.                 (fmtstring, keys) = transform_format_groups(fmt)
  135.                 values = [ args[key] for key in keys ]
  136.                 application = media.get('app', '')
  137.                 type = media.get('type', 'Music')
  138.                 enabled = '1'
  139.                 array = '\\0'.join([
  140.                     application,
  141.                     type,
  142.                     enabled,
  143.                     fmtstring] + values + [
  144.                     ''])
  145.                 self.send_uux(mediainfo = array, callback = callback)
  146.             else:
  147.                 log.debug('msn not sending CurrentMedia because no fmt or args. (fmt=%r, args=%r)', fmt, args)
  148.                 self.send_uux(message = messageobj.message, callback = callback)
  149.         else:
  150.             log.debug('msn not sending CurrentMedia because media is None')
  151.             self.send_uux(messageobj.message, callback = callback)
  152.  
  153.     
  154.     def recv_msg_notification(self, msg):
  155.         if msg.name == 'Hotmail':
  156.             MD = self.extract_oim_info(msg)
  157.             self.oims = msn.oim.OIMMessages(self, MD)
  158.         else:
  159.             log.warning('unknown msg/notification')
  160.  
  161.     
  162.     def extract_oim_info(self, oim_info_msg):
  163.         msg_obj = rfc822.Message(oim_info_msg.payload.body())
  164.         maildata = msg_obj['Mail-Data']
  165.         if 'too-large' in maildata:
  166.             MD = None
  167.         else:
  168.             MD = util.tag(maildata)
  169.         return MD
  170.  
  171.     
  172.     def recv_msg_oims(self, msg):
  173.         if msg.name == 'Hotmail':
  174.             MD = self.extract_oim_info(msg)
  175.             self.oims += msn.oim.OIMMessages(self, MD)
  176.         
  177.  
  178.     
  179.     def received_oims(self, oims):
  180.         return oims
  181.  
  182.     received_oims = event(received_oims)
  183.     
  184.     def _challenge_response(self, chl_str, challenge_key, mystery_num = 242854337):
  185.         hash = hashlib.md5(chl_str + challenge_key).digest()
  186.         hash_ints = struct.unpack('<llll', hash)
  187.         hash_ints = [ x & MAX_SINT for x in hash_ints ]
  188.         chl_str += self.challenge_id
  189.         chl_str += string.zfill('', 8 - len(chl_str) % 8)
  190.         chl_nums = struct.unpack('<%di' % len(chl_str) / 4, chl_str)
  191.         while i < len(chl_nums) - 1:
  192.             j = chl_nums[i]
  193.             j = mystery_num * j % MAX_SINT
  194.             j += hi
  195.             j = hash_ints[0] * j + hash_ints[1]
  196.             j = j % MAX_SINT
  197.             hi = (chl_nums[i + 1] + j) % MAX_SINT
  198.             hi = hash_ints[2] * hi + hash_ints[3]
  199.             hi = hi % MAX_SINT
  200.             lo = lo + hi + j
  201.             i += 2
  202.             continue
  203.             hi = lo = i = 0
  204.         
  205.         byteswap = lambda i, f: struct.unpack('>' + f, struct.pack('<' + f, i))[0]
  206.         hi = byteswap((hi + hash_ints[1]) % MAX_SINT, 'L')
  207.         lo = byteswap((lo + hash_ints[3]) % MAX_SINT, 'L')
  208.         key = byteswap((hi << 0x20L) + lo, 'Q')
  209.         ls = [ byteswap(abs(byteswap(x, 'Q') ^ key), 'Q') for x in struct.unpack('>QQ', hash) ]
  210.         return ''.join((lambda .0: for x in .0:
  211. ('%x' % x).zfill(16).lower())(ls))
  212.  
  213.  
  214.  
  215. def __test():
  216.     import doctest as doctest
  217.     doctest.testmod(verbose = True)
  218.  
  219. if __name__ == '__main__':
  220.     __test()
  221.  
  222.